package cn.liufuwen.websocket.netty;


import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.ssl.SslHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

import javax.net.ssl.SSLEngine;

public class WebSocketServerInitialzer extends ChannelInitializer<SocketChannel> {
    /**
     * 初始化SocketChannel，配置SSL和WebSocket处理逻辑。
     *
     * @param channel 表示一个网络连接的通道，用于读写数据。
     * @throws Exception 如果初始化过程中出现任何异常。
     */
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        // 创建SSL Engine，用于加密通信。
        SSLEngine sslEngine = SslUtil.createSSLContext("classpath:mystore.jks", "1234567").createSSLEngine();
        // 配置SSL Engine为服务器模式，不需要客户端验证。
        sslEngine.setNeedClientAuth(false);
        sslEngine.setUseClientMode(false);
        // 创建SSL处理handler。
        SslHandler sslHandler = new SslHandler(sslEngine);
        // 获取通道的pipeline，用于添加处理逻辑。
        ChannelPipeline pipeline = channel.pipeline();
        // 添加SSL处理handler到pipeline。
        pipeline.addLast(sslHandler);
        // 添加HTTP解码器，用于将TCP数据流解码为HTTP消息。
        pipeline.addLast("http-decoder", new HttpServerCodec());
        // 添加HTTP消息聚合器，用于将多个HTTP消息聚合为一个FullHttpRequest或FullHttpResponse。
        pipeline.addLast("http-aggregator", new HttpObjectAggregator(65536));
        // 添加ChunkedWriteHandler，用于支持异步发送大文件。
        // 加入chunked 主要作用是支持异步发送的码流（大文件传输），但不专用过多的内存，防止java内存溢出
        pipeline.addLast(new ChunkedWriteHandler());
        // 添加WebSocket服务器处理handler。
        pipeline.addLast(new WebSocketServerHandler());
        // 添加WebSocket协议处理handler，指定WebSocket路径为/tunnel。
        pipeline.addLast(new WebSocketServerProtocolHandler("/tunnel"));
    }
}

